#include <iostream>
#include <pthread.h>
#include <vector>
#include "learn_3.hpp"

struct Test1 {
    std::string test1;
    int test2;
    float test3;

    REFLECT(test1, test2, test3);

    // template <class Func> 
    // constexpr void for_each_members(Func&& func) 
    // { 
    //     func("test1", test1);
    //     func("test2", test2);
    //     func("test3", test3); 
    // };
};

template<class T>
struct Test2
{
    std::string test1;
    T test2;
    float test3;

    REFLECT(test1, test2, test3);
};

template<class T>
struct Test3
{
    std::string test1;
    T test2;
    float test3;
};

REFLECT_TYPE_TEMPLATED((Test3<T>, class T), test1, test2, test3);
// template <class T> 
// struct reflect_trait<Test3<T>> 
// { 
//     template<class Func> static constexpr void for_each_members(Test3<T>& object, Func&& func) 
//     { 
//         func("test1", object.test1);
//         func("test2", object.test2);
//         func("test3", object.test3); 
//     } 
// };

int main(void)
{
    Test1 t;
    t.test1 = "test_3";
    t.test2 = 20;
    t.test3 = 20.2;
    std::cout << serialize(t) << std::endl;

    Test2<int> t2;
    t2.test1 = "test_3";
    t2.test2 = 20;
    t2.test3 = 20.2;
    std::cout << serialize(t2) << std::endl;

    Test3<double> t3;
    t3.test1 = "test_3";
    t3.test2 = 20.5;
    t3.test3 = 20.2;
    std::cout << serialize(t3) << std::endl;

    return 0;
}